﻿/*
*************************************************************************
**                                                                      *
** ZERING TEST SCRIPT                                                   *
**                                                                      *
** WebSocket 系统示例程序                                               *
**                                                                      *
*************************************************************************
**                                                                      *
** 数据收发，和内存数据库的应用                                         *
**                                                                      *
*************************************************************************
*/
/***********************************************************************/
/*  Function Name : TabInit                                            */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 建立数据库表                                            */
/*  OTHERS   :                                                         */
/***********************************************************************/
function TabInit() {
    /*
    *********************************************************************
    ** 生成连接状态的 "模板对象"                                        *
    *********************************************************************
    */
    CONN_TYPE         = new Object;
    CONN_TYPE.State   = "FREE";
    CONN_TYPE.SID     = "1234567_0";
    CONN_TYPE.ConnId  = 12345;
    /*
    *********************************************************************
    ** 将“模板对象”转换为内存数据库的内部类型                         *
    *********************************************************************
    */
    MDB_LoadType(CONN_TYPE, "CONN_TYPE");
    /*
    *********************************************************************
    ** 根据这个内部类型在内存数据库中建表                               *
    *********************************************************************
    */
    if ("OK" == MDB_TableNew("CONN_TABLE", "CONN_TYPE", "SID")) {
        API_Trace("连接状态表建立成功");
    } else {
        API_Trace("连接状态表建立失败");
    }
}
/***********************************************************************/
/*  Function Name : OnInit                                             */
/*---------------------------------------------------------------------*/
/*  FUNCTION : 初始化函数                                              */
/*  OTHERS   :                                                         */
/***********************************************************************/
function OnInit() {
    /*
    *********************************************************************
    ** 初始化内存数据库中的数据表                                       *
    *********************************************************************
    */
    if (0 == API_GetFlag(0)) {
        TabInit();
        API_SetFlag(0, 1);
    }
    /*
    *********************************************************************
    ** 加载库函数                                                       *
    *********************************************************************
    */
    API_LoadJs("Lib.js");
    /*
    *********************************************************************
    ** 设置 RPC 函数                                                    *
    *********************************************************************
    */
    API_SetRpcHandler("WS_JOIN:/echo", RPC_Join);
    API_SetRpcHandler("WS_LEAV:/echo", RPC_Leave);
    API_SetRpcHandler("WS_DATA:/echo", RPC_Data);
    API_Trace("WsDemo 启动完毕");
}
/***********************************************************************/
/*  Function Name : RPC_Join                                           */
/*---------------------------------------------------------------------*/
/*  FUNCTION : WebSocket 连接事件处理函数                              */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Join(p_uConnNo) {
    /*
    *********************************************************************
    ** 打印来自 HCTR 的连接号                                           *
    *********************************************************************
    */
    API_Trace(sprintf("HCTR 的 %d 号连接建立", p_uConnNo));
    /*
    *********************************************************************
    ** 生成 SID                                                         *
    *********************************************************************
    */
    var l_List = new Array(API_Time32().toString(), p_uConnNo.toString());
    var l_Sid = l_List.join("_");
    /*
    *********************************************************************
    ** 将连接对象插入数据表                                             *
    *********************************************************************
    */
    CONN_OBJ         = new Object;
    CONN_OBJ.State   = "CONN";
    CONN_OBJ.SID     = l_Sid;
    CONN_OBJ.ConnId  = p_uConnNo;

    API_Trace(sprintf("连接对象为：%s", JSON.stringify(CONN_OBJ)));
    API_Trace(sprintf("将连接对象插入数据表 -- %s", MDB_TableInsert("CONN_TABLE", CONN_OBJ)));
    /*
    *********************************************************************
    ** 返回 SID                                                         *
    *********************************************************************
    */
    return l_Sid;
}
/***********************************************************************/
/*  Function Name : RPC_Leave                                          */
/*---------------------------------------------------------------------*/
/*  FUNCTION : WebSocket 关闭事件处理函数                              */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Leave(p_Sid) {

    API_Trace(sprintf("%s 已经关闭连接", p_Sid));
    API_Trace(sprintf("从数据表中删除 -- %s", MDB_TableRemove("CONN_TABLE", "SID like %0", p_Sid)));
}
/***********************************************************************/
/*  Function Name : RPC_Data                                           */
/*---------------------------------------------------------------------*/
/*  FUNCTION : WebSocket 数据处理函数                                  */
/*  OTHERS   :                                                         */
/***********************************************************************/
function RPC_Data(p_Sid, p_Text) {
    API_Trace(sprintf("%s 发送数据 %s", p_Sid, p_Text));
    OBJ_ARRAY = MDB_TableQuery("CONN_TABLE", "SID like %0", p_Sid);
    API_Trace(sprintf("连接对象为：%s", JSON.stringify(OBJ_ARRAY[0])));

    Input = JSON.parse(p_Text);

    MSG = new Object;
    MSG.tag = "info";
    MSG.sid = p_Sid;
    MSG.txt = Input.post.text;
 
    API_RpcSend
    ( "HCTR.WS.TEXT.SEND",
      OBJ_ARRAY[0].ConnId,
      JSON.stringify(MSG));
}
/*
*************************************************************************
**                                                                      *
** ZERING TEST SCRIPT                                                   *
**                                                                      *
** WebSocket 系统示例程序                                               *
**                                                                      *
*************************************************************************
**                                                                      *
** 调用内存数据库 API                                                   *
**                                                                      *
*************************************************************************
*/